// cf-132d
// 题意：给定一个整数n的二进制表示(长度<=10^6)，现在要将其表示为
//       n=a1+a2+a3+...+am, 其中ai是非负的2的幂次乘以1或者-1。
//       问m最小是多少，输出一种方案。
//
// 题解：可以用dp做，dp就是以每一位用+和-做为两种状态来搞。
//       也可以用构造或者说贪心。对于一段大于1个连续的1, 例如..111..
//       我们可以2^s - 2^t这种形式，如果是单独的1就直接加。
//       当然有个例外，就是1110111这种中间有个零相隔的，这种也处理下就行。
//
//       这种题目虽然不难，但是从看到题到完整想出来以及自己设计数据，还是
//       不够快，还得多练这种类型的题目。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <vector>
#include <string>

struct data { bool op; int p; };
std::vector<data> ans;
std::string s;
int n;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> s;
	n = s.size();
	for (int i = 0; i < n; i++) {
		if (s[i] == '0') continue;
		int j = i, c1 = 0, last = i;
		bool op = false;
		for (; j < n; j++) {
			if (s[j] == '1') { c1++; continue; }
			if (j < n - 1 && s[j + 1] == '1') {
				if (op) {
					if (j == n - 1) ans.push_back({false, n - j});
					else ans.push_back({false, n - j - 1});
				} else {
					if (c1 == 1) {
						ans.push_back({true, n - j});
						last = j + 1;
						c1 = 0;
					} else {
						op = true;
						ans.push_back({true, n - last});
						ans.push_back({false, n - j - 1});
					}
				}
				continue;
			}
			break;
		}
		if (op) ans.push_back({false, n - j});
		else {
			if (c1 == 1) ans.push_back({true, n - j});
			else {
				ans.push_back({true, n - last});
				ans.push_back({false, n - j});
			}
		}
		i = j - 1;
	}
	std::cout << ans.size() << '\n';
	for (auto i : ans)
		std::cout << (i.op ? '+' : '-') << "2^" << i.p << '\n';
}

